/*
============================================================================
 Name        : dd_queue.h
 Author      : Jian (raphyer@hotmail.com)
 Version     :
 Copyright   : GPL
 Description : dd_queue.h - header file
============================================================================
*/

#ifndef DD_QUEUE_H
#define DD_QUEUE_H

#include "dd_define.h"


__DD_BEGIN_DECLS

/* 
* The queue implement 
*/
typedef struct __dd_queue dd_queue;
typedef void dd_queue_value ;
/* if you want to deque the value of queue, just return value != 0 */
typedef int dd_fqueue_handle_value(dd_queue_value* val) ;

struct __dd_queue_node ;

struct __dd_queue {
    struct __dd_queue_node* head ;
    struct __dd_queue_node* tail ;
};

dd_queue* dd_queue_create() ;

void dd_queue_destroy(dd_queue* queue, void (*free_fun)(void*)) ;

void dd_queue_reset(dd_queue* queue, void (*free_fun)(void*)) ;

void dd_queue_enqueue(dd_queue* queue, dd_queue_value* value) ;

dd_queue_value* dd_queue_dequeue(dd_queue* queue) ;

/* return the value that handler function return */
int dd_queue_try_dequeue(dd_queue* queue, dd_fqueue_handle_value* handler) ;

DD_BOOL dd_queue_is_empty(const dd_queue* queue) ;


#ifdef __DD_TEST

DD_BOOL dd_queue_test() ;

#endif

__DD_END_DECLS

#endif	/* DD_QUEUE_H */

/* End of File */
